home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Power 1996 October
/
MACPOWER-1996-10.ISO.7z
/
MACPOWER-1996-10.ISO
/
AMUG
/
Internet_31
/
NetCacheResolver 0.9d6
/
NetCacheResolver 0.9d6 ト
/
library
/
NCR_File.c
< prev
next >
Wrap
Text File
|
1996-05-12
|
7KB
|
303 lines
// NetCache Resolver, 1995 (C) Mizutori Tetsuya
// - NCR_File.c, October 8, 1995
// This document is pretty printed in 10-point Geneva font.
#include "NCR_File.h"
#include "NCR_Error.h"
// definition
#define kNilFilterProc nil
// prototype
//static void ErrorMessage ( long err, StringPtr string, Boolean fatal );
/***** Standard File Get & Put *****/
Boolean GetFilename ( FSSpec *theFSSpec, short numTypes, SFTypeList typeList )
{
StandardFileReply reply;
// short numTypes = -1; /* all types */
// OSType typeList[] = {'TEXT', 'PICT', 0, 0};
OSErr err;
GestaltCheck( gestaltStandardFileAttr );
StandardGetFile( kNilFilterProc, numTypes, typeList, &reply );
if ( ! reply.sfGood ) return false; // return by "Cancel"
*theFSSpec = reply.sfFile;
return true; // return by "Open"
}
Boolean PutFilename ( FSSpec *theFSSpec, StringPtr prompt, Boolean *replacing )
{
StandardFileReply reply;
// Str63 prompt = "¥p";
StringPtr defaultName;
GestaltCheck( gestaltStandardFileAttr );
defaultName = theFSSpec->name;
StandardPutFile( prompt, defaultName, &reply );
if ( ! reply.sfGood ) return false; // return by "Cancel"
*replacing = reply.sfReplacing;
*theFSSpec = reply.sfFile;
return true; // return by "Open"
}
OSErr ReadFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
{
short fRefNum;
long textSize;
OSErr err;
if ( h == nil ) return nilHandleErr;
err = FSpGetFInfo( theFSSpec, theFInfo );
if ( err != noErr ) return err;
err = FSpOpenDF( theFSSpec, fsRdPerm, &fRefNum );
if ( err != noErr ) return err;
err = GetEOF( fRefNum, &textSize );
if ( err != noErr ) return err;
// err = SetFPos( fRefNum, fsFromLEOF, 0 );
// if ( err != noErr ) return err;
SetHandleSize( h, textSize );
if ( (err=MemError()) != noErr )
ErrorMessageMEM( err, true );
HLock( h );
err = FSRead( fRefNum, &textSize, (Ptr) *h );
HUnlock( h );
FSClose( fRefNum );
if ( err != noErr ) return err;
*size = textSize;
return noErr;
}
OSErr WriteFile ( FSSpec *theFSSpec, FInfo *theFInfo, Handle h, long *size )
{
OSType fdType, fdCreator;
short fRefNum;
long fileID;
long textSize;
OSErr err;
if ( h == nil ) return nilHandleErr;
fdType = theFInfo->fdType;
fdCreator = theFInfo->fdCreator;
#ifdef COMMENT
#ifdef REPLACE_HINT
if ( ! replacing ) {
#else REPLACE_HINT
if ( !QueryFile ( theFSSpec, &fileID ) ) {
#endif REPLACE_HINT
err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
if ( err != noErr ) return err;
}
#endif /* COMMENT */
err = FSpCreate( theFSSpec, fdCreator, fdType, smSystemScript );
if ( err != dupFNErr && err != noErr ) return err;
err = FSpOpenDF( theFSSpec, fsRdWrPerm, &fRefNum );
if ( err != noErr ) return err;
err = SetEOF( fRefNum, 0 );
if ( err != noErr ) goto out;
textSize = *size;
HLock( (Handle) h );
err = FSWrite( fRefNum, &textSize, (Ptr) *h );
HUnlock( (Handle) h );
out:
FSClose( fRefNum );
if ( err != noErr ) return err;
*size = textSize;
FlushVol( nil, theFSSpec->vRefNum );
TouchDir( theFSSpec->vRefNum, theFSSpec->parID );
return noErr;
}
/***** Get File Information *****/
#define kItsAVolume 1
#define kItsAFolder 2
#define kItsAFile 3
OSErr GetSpecType ( FSSpec *theFSSpec )
{
CInfoPBRec pb;
OSErr err;
short objType = 0;
if ( (theFSSpec->parID) == fsRtParID )
objType = kItsAVolume;
else {
pb.hFileInfo.ioNamePtr = theFSSpec->name;
pb.hFileInfo.ioVRefNum = theFSSpec->vRefNum;
pb.hFileInfo.ioDirID = theFSSpec->parID;
pb.hFileInfo.ioFDirIndex = 0;
err = PBGetCatInfoSync( &pb );
if ( err == noErr ) {
if ( (pb.hFileInfo.ioFlAttrib & 0x10) != 0 )
objType = kItsAFolder;
else
objType = kItsAFile;
}
}
return objType;
}
Boolean QueryFile ( FSSpec *theFSSpec, long *fileID )
{
// long fileID;
CInfoPBRec pb;
HFileInfo *fpb = (HFileInfo *) &pb;
// DirInfo *dpb = (DirInfo *) &pb;
OSErr err;
fpb->ioNamePtr = theFSSpec->name;
fpb->ioVRefNum = theFSSpec->vRefNum;
fpb->ioDirID = theFSSpec->parID;
fpb->ioFDirIndex = 0;
err = PBGetCatInfo( &pb, false );
if ( err != noErr ) return false; /* the filename does not exist */
#ifdef OLDVERSION
if ( (fpb->ioFlAttrib & 0x10) != 0 )
return false; /* but it's a folder */
else {
*fileID = fpb->ioDirID; /* returns its hard file ID */
return true; } /* it's a plain file */
#else /* OLDVERSION */
switch ( GetSpecType( theFSSpec ) ) {
case kItsAFile:
*fileID = fpb->ioDirID;
return true;
case kItsAVolume:
case kItsAFolder:
default:
break;
}
#endif /* OLDVERSION */
return false;
}
/***** Finder controls *****/
OSErr TouchDir ( short vRefNum, long dirID )
{
CInfoPBRec info;
Str255 name;
OSErr err;
info.dirInfo.ioDrDirID = dirID;
info.dirInfo.ioVRefNum = vRefNum;
info.dirInfo.ioNamePtr = name;
info.dirInfo.ioFDirIndex = -1;
err = PBGetCatInfo( &info, false );
if ( !err ) {
info.dirInfo.ioCompletion = 0;
info.dirInfo.ioDrDirID = info.dirInfo.ioDrParID;
info.dirInfo.ioFDirIndex = 0;
GetDateTime( &info.dirInfo.ioDrMdDat );
err = PBSetCatInfo( &info, false );
}
return err;
}
/**** Generate a filename *****/
#define MAX_FNAME 31
void GenFilename ( StringPtr newFilename, StringPtr oldFilename )
{
short c;
short i,n;
n = oldFilename[0];
for (i=0;i<=n;++i) newFilename[i] = oldFilename[i];
// foooxyz -> foooox.1
if ( n >= MAX_FNAME-1 ) {
newFilename[MAX_FNAME-1] = '.';
newFilename[MAX_FNAME] = '1';
newFilename[0] = MAX_FNAME;
return; }
// foo.1 -> foo.2
// foo.a -> foo.b
if ( n >= 2 && newFilename[n-1] == '.' ) {
c = newFilename[n];
if ( '0' <= c && c < '9' ) newFilename[n] = c+1;
else if ( c == '9' ) newFilename[n] = 'a';
else if ( 'a' <= c && c < 'z' ) newFilename[n] = c+1;
else if ( c == 'z' ) newFilename[n] = 'A';
else if ( 'A' <= c && c < 'Z' ) newFilename[n] = c+1;
else if ( c == 'Z' ) newFilename[n] = '0';
return;
}
// foo -> foo.1
if ( n <= MAX_FNAME-2 ) {
newFilename[n+1] = '.';
newFilename[n+2] = '1';
newFilename[0] = n+2;
return; }
}
#ifdef COMMENT
/***** Do Error Messages *****/
#define kAlertID 1000
#define kErrStringID 1000
#define kNilFilterProc nil
#define kMoveToFront (WindowPtr)-1L
static void ErrorMessage ( long err, StringPtr string, Boolean fatal )
{
short item;
Str31 errStr;
Str255 str = "¥p";
NumToString( err, errStr );
ParamText( "¥pError = ", errStr, "¥p¥r", string );
if ( fatal ) {
item = StopAlert( kAlertID, kNilFilterProc );
ExitToShell();
} else {
item = NoteAlert( kAlertID, kNilFilterProc );
if ( item == cancel ) ExitToShell();
}
}
#endif /*COMMENT */
// end of program